% makePatterns (n)
% ================
% Crea una matriz 'table' de pruebas, que en conjunto se la
% denomica 'epoca' cada fila representa una prueba para una 
% 'neurona' de perseptron simple

% Se preprosesan los valores:
% los valores de verdad son 1 y -1 siendo -1 falso, y 1 verdadero

% Parametros:
% n - representan la cantidad de entradas de la neurona, 
% su dimension

% NOTAS:
% (*) Los índices en Octave comienzan desde 1 !!!
% (*) Antes de acceder una variable global hay que declararla 
% dentro de las funciones que la van a modificar


function table=makePatterns(n)
	
	if(n>0)
		global table;
		level=2^n;
		table=-1*ones(level,n+1);
		complete(level,n);
	else
		error("parameter 'n' must be an integer positive");
	endif

endfunction

	
function complete(level,n)
	recu(1,level,1,0);
	evaluate(level,n);
endfunction

function recu(val,l,i,j)
	if(l==1)
		global table;
		table(i,j)=val;
	else
		nextl=l/2;
		recu(val,nextl,i,j+1);
		recu(-val,nextl,i+nextl,j+1);
		completecolumn(val,l,i,j);	
	endif
endfunction

function completecolumn(val,l,i,j)
	if(j!=0)
		global table;
		table(i,j)=val;
	endif
	if(l>1)
		completecolumn(val,l-1,i+1,j);
	endif
endfunction

function evaluate(level,n)
	global table;
	for i=1:level
		table(i,n+1)=issimetry(table,i,1,n);
	endfor
endfunction


function ans=issimetry( table, row, p1, p2 )
	if(p2 == p1 || p2 < p1)
		ans= 1;
	else 
		if(table(row,p1)==table(row,p2))
			p1=p1+1;
			p2=p2-1;
			ans= issimetry(table, row, p1, p2);
		else
			ans=-1;
		endif
	endif
endfunction
